package org.budo.graph.service.util;

import org.budo.graph.config.BudoGraphConfigurer;
import org.budo.graph.service.BudoGraphService;
import org.budo.graph.service.impl.AbstractBudoGraphService;
import org.budo.support.application.registry.AbstractBudoApplicationRegistry;
import org.budo.support.lang.util.ReflectUtil;
import org.budo.support.spring.util.SpringUtil;

import lombok.extern.slf4j.Slf4j;

/**
 * @author lmw
 */
@Slf4j
public class BudoGraphApplicationUtil {
    public static String getApplicationName() {
        AbstractBudoApplicationRegistry applicationRegistry = SpringUtil.getBeanCached(AbstractBudoApplicationRegistry.class);
        if (null != applicationRegistry && null != applicationRegistry.getApplicationName()) {
            return applicationRegistry.getApplicationName();
        }

        BudoGraphService budoGraphService = SpringUtil.getBeanCached(BudoGraphService.class);
        if (null != budoGraphService && null != budoGraphService.getApplicationName()) {
            return budoGraphService.getApplicationName();
        }

        AbstractBudoGraphService abstractBudoGraphService = SpringUtil.getBeanCached(AbstractBudoGraphService.class);
        if (null != abstractBudoGraphService && abstractBudoGraphService.getProperties().containsKey("applicationName")) {
            return abstractBudoGraphService.getProperties().get("applicationName") + "";
        }

        // 从 dubbo:application name 中取
        Class<?> applicationConfigType = ReflectUtil.classForName(BudoGraphConfigurer.APPLICATION_CONFIG_TYPE);
        Object applicationConfig = SpringUtil.getBeanCached(applicationConfigType);
        if (null != applicationConfig) {
            return ReflectUtil.invokeGet(applicationConfig, "name"); // applicationConfig.getName()
        }

        log.error("#74 no ApplicationName, applicationContext=" + SpringUtil.getApplicationContext());
        return null;
    }
}